﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace V82.ОбщиеМодули
{
	public partial class РаботаСОбщимиПеременными
	{
		// МЕХАНИЗМ ОБЩИХ ПЕРЕМЕННЫХ
		//
		// Для работы с механизмом общих переменных используются функции
		//	1. глЗначениеПеременной - для получения значения переменной
		//	2. глЗначениеПеременнойУстановить - для изменения значения переменной
		//									(используется в исключительных ситуациях, не для всех переменных).
		//
		// ВАЖНО: не следует явно вызывать экспортные функции этого модуля
		////////////////////////////////////////////////////////////////////////////////
		// ПРОЦЕДУРЫ МЕХАНИЗМА ОБЩИХ ПЕРЕМЕННЫХ
		// Функция предназначена для получения значения по имени переменной из КЭШа конфигурации
		// Вызывается из функции ПолучитьЗначениеПеременной
		//
		// Параметры:
		//	Имя					- Строка, имя переменной
		//	НайденноеЗначение	- Произвольное значение, значение переменной. Заполняется в ходе выполнения функции
		//  Кэш					- КЭШ из которого получали значение. Заполняется в ходе выполнения функции
		//  ПоместитьВКэш		- Булево, Истина, если значение требуется поместить в КЭШ. Заполняется в ходе выполнения функции
		//
		// Возвращаемое значение:
		//  Булево - Истина, если значение было получено из КЭШа, иначе Ложь
		//

		public object ПолучитьИзКэшаКонфигурации(/*Имя, НайденноеЗначение, Кэш, ПоместитьВКэш*/)
		{
			//Кэш = глОбщиеЗначения;
			//Кэш = ПараметрыСеанса.ОбщиеЗначения.Получить();
			if(true/*Кэш <> Неопределено*/)
			{
				/*// Ищем значение в структуре
*/
				if(true/*Кэш.Свойство(Имя, НайденноеЗначение)*/)
				{
				}
			}
			/*//Не нашли значение в кэше - вычисленное значение надо будет поместить в Кэш
*/
			//ПоместитьВКэш = Истина;
			return null;
		}
		//
		// Функция предназначена для получения значения по имени переменной
		// Вызывается из функции глЗначениеПеременной
		//
		// Параметры:
		//	Имя - Строка, имя переменной
		//
		// Возвращаемое значение:
		//  Произвольное значение
		//

		public object ПолучитьЗначениеПеременной(/*Имя*/)
		{
			//ИмяПараметраВР = ВРег(Имя);
			//НайденноеЗначение = Неопределено;
			//Кэш = Неопределено;
			//ПоместитьВКэш = Ложь;
			//НайденноеЗначение = ОбщегоНазначенияПереопределяемый.ПолучитьЗначениеПеременной(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш);
			if(true/*НайденноеЗначение = Неопределено*/)
			{
				if(true/*ИмяПараметраВР = ВРег("глКомпонентаСклоненияФИО")*/)
				{
					if(true/*НЕ ПолучитьИзКэшаКонфигурации(ИмяПараметраВР, НайденноеЗначение, Кэш, ПоместитьВКэш)*/)
					{
					}
				}
			}
			if(true/*ПоместитьВКэш*/)
			{
				if(true/*глОбщиеЗначения = Неопределено*/)
				{
					//глОбщиеЗначения = Новый Структура;
				}
				//глОбщиеЗначения.Вставить(Имя, НайденноеЗначение);
				/*// В функции ПолучитьИзКэшаКонфигурации получили значение параметра сеанса
*/
				/*// Добавим в него новое значение переменной и поместим в КЭШ
*/
				//Кэш.Вставить(Имя, НайденноеЗначение);
				//ПараметрыСеанса.ОбщиеЗначения = Новый ХранилищеЗначения(Кэш);
			}
			return null;
		}

		public void УстановитьЗначениеПеременной(/*ИмяПараметра, ЗначениеПараметра, ОбновитьКэшНаСервере = Ложь*/)
		{
			/*// обновление переменной на клиенте или во внешнем соединении  
*/
			/*// если глобальная переменная глОбщиеЗначения еще не инициализирована, инициализируем ее 
*/
			if(true/*глОбщиеЗначения = Неопределено*/)
			{
				//глОбщиеЗначения = Новый Структура;
			}
			/*// Установим новое значение переменной
*/
			//глОбщиеЗначения.Вставить(ИмяПараметра, ЗначениеПараметра);
			if(true/*НЕ ОбновитьКэшНаСервере*/)
			{
			}
			/*// Обновим значение переменной в кэше на сервере. Это происходит в двух случаях:
*/
			/*// 1. при выполнении на клиенте, когда ОбновитьКэшНаСервере = Истина (см. выше)
*/
			/*// 2. при выполнении на сервере
*/
			//КэшНаСервере = ПараметрыСеанса.ОбщиеЗначения.Получить();
			/*// Если ПараметрыСеанса.ОбщиеЗначения еще не инициализирована, инициализируем ее 
*/
			if(true/*КэшНаСервере = Неопределено*/)
			{
				//КэшНаСервере = Новый Структура;
			}
			//КэшНаСервере.Вставить(ИмяПараметра, ЗначениеПараметра);
			//ПараметрыСеанса.ОбщиеЗначения = Новый ХранилищеЗначения(КэшНаСервере);
		}
		// Процедура добавляет обязательные значения в кэш ОбщиеЗначения при запуске системы и после очистки кэша
		//

		public void ДобавитьОбязательныеЗначенияВКэш(/**/)
		{
			//глЗначениеПеременной("РазрешитьВыводитьСообщенияВПанельКомментариев");
			//глЗначениеПеременной("ДублироватьСообщенияВЖурналРегистрации");
			//УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"), "ВыводитьСообщенияВПанельКомментариев");
		}
		////////////////////////////////////////////////////////////////////////////////
		// ПРОЦЕДУРЫ ДЛЯ ПОДДЕРЖКИ АКТУАЛЬНОСТИ ЗНАЧЕНИЙ ПЕРМЕННЫХ
		// Процедура очищает переменные глОбщиеЗначения и ПараметрыСеанса.ОбщиеЗначения
		// используемые функцией глЗначениеПеременной.
		//

		public void ОчиститьДанныеКЭШа(/**/)
		{
			//ПараметрыСеанса.ОбщиеЗначения = Новый ХранилищеЗначения(Новый Структура);
			//глОбщиеЗначения = Неопределено;
			//ОбновитьПовторноИспользуемыеЗначения();
			/*//Добавление обязательных значений в кеш ОбщиеЗначения
*/
			//ДобавитьОбязательныеЗначенияВКэш();
		}

		public void ОбновитьКЭШПриЗаписиКонстант(/*Источник, Отказ*/)
		{
			if(true/*НЕ Отказ*/)
			{
				//ОчиститьДанныеКЭШа();
			}
		}

		public void ОбновитьКЭШПриЗаписиРегистраСведений(/*Источник, Отказ, Замещение*/)
		{
			if(true/*НЕ Отказ*/)
			{
				//ОчиститьДанныеКЭШа();
			}
		}
		////////////////////////////////////////////////////////////////////////////////
		// ПРОЦЕДУРЫ ВЫЧИСЛЯЮЩИЕ ЗНАЧЕНИЯ ПЕРЕМЕННЫХ
		// Процедура инициализирует глобальную переменную УчетнаяПолитикаОтраженияЗарплатыВУчете.
		//
		// Параметры:
		//  Нет.
		//

		public object ЗаполнениеУчетнойПолитикиНалоговомуУчету(/**/)
		{
			//УчетнаяПолитикаПоНалоговомуУчету = Новый Соответствие;
			if(true/*ПравоДоступа("Чтение", Метаданные.Справочники.Организации)*/)
			{
				//УчетнаяПолитикаПоНалоговомуУчетуСоответствие = Новый Соответствие;
				//УчетнаяПолитикаПоНалоговомуУчетуСоответствие.Вставить(Справочники.Организации.ПустаяСсылка(),Новый Структура("УСН,ОбъектНалогообложенияУСН,ОрганизацияЯвляетсяПлательщикомЕНВД,УплачиватьДобровольныеВзносыВФСС,ВариантУчетаРасходовПоНалогамСФОТВНалоговомУчете, ТочностьИсчисленияЕСН, ТочностьИсчисленияПФР, ПорядокРасчетаВычетаФБ",Ложь,Перечисления.ОбъектыНалогообложенияПоУСН.ПустаяСсылка(),Ложь,Ложь,Перечисления.ВариантыУчетаРасходовПоНалогамСФОТВНалоговомУчете.ПустаяСсылка(),Перечисления.ПорядкиОкругленияЕСН.Точно,Перечисления.ПорядкиОкругленияЕСН.Точно, Перечисления.ПорядкиИсчисленияВычетаПоЕСН.ПоСуммеСтраховыхВзносов));
				//УчетнаяПолитикаПоНалоговомуУчету.Вставить('00010101',УчетнаяПолитикаПоНалоговомуУчетуСоответствие);
				//Запрос = Новый Запрос;
				//Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
				/*Запрос.Текст = 
		"ВЫБРАТЬ
		|	МАКСИМУМ(ПериодыУчетнойПолитики.Период) КАК КонечныйПериод,
		|	МИНИМУМ(ПериодыУчетнойПолитики.Период) КАК НачальныйПериод
		|ИЗ
		|	(ВЫБРАТЬ
		|		УчетнаяПолитикаНалоговыйУчет.Период КАК Период
		|	ИЗ
		|		РегистрСведений.УчетнаяПолитикаОрганизаций КАК УчетнаяПолитикаНалоговыйУчет) КАК ПериодыУчетнойПолитики";*/
				//Выборка = Запрос.Выполнить().Выбрать();
				/*ПериодыТекст =
		"ВЫБРАТЬ
		|	ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0) КАК Период
		|ПОМЕСТИТЬ ВТПериоды";*/
				if(true/*Выборка.Следующий()*/)
				{
					//НачальныйПериод = Выборка.НачальныйПериод;
					//КонечныйПериод = Выборка.КонечныйПериод;
					if(true/*ЗначениеЗаполнено(НачальныйПериод)*/)
					{
						/*// конец месяца налогового периода
*/
						//КонецМесяца = КонецМесяца(НачальныйПериод);
						/*// первый месяц
*/
						//ПериодыТекст = "ВЫБРАТЬ ДАТАВРЕМЯ(" + Формат(КонецМесяца,"ДФ=гггг,М,д,Ч,м,с") + ")КАК Период ПОМЕСТИТЬ ВТПериоды";
						/*// прибавим остальные месяцы
*/
						while(true/*КонецМесяца < КонечныйПериод*/)
						{
							//КонецМесяца = КонецМесяца(КонецМесяца+1);
							//ПериодыТекст = ПериодыТекст +" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ДАТАВРЕМЯ(" + Формат(КонецМесяца,"ДФ=гггг,М,д,Ч,м,с") + ")";
						}
						//;;
					}
				}
				//Запрос.Текст = ПериодыТекст;
				//Запрос.Выполнить();
				/*Запрос.Текст = 
		"ВЫБРАТЬ РАЗРЕШЕННЫЕ
		|	ЕСТЬNULL(ВТПериоды.Период, ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0)) КАК Период,
		|	Организации.Ссылка КАК Организация,
		|	ЕСТЬNULL(ВЫБОР КОГДА УчетнаяПолитикаНалоговыйУчет.СистемаНалогообложения = ЗНАЧЕНИЕ(Перечисление.СистемыНалогообложения.Упрощенная) ТОГДА ИСТИНА ИНАЧЕ ЛОЖЬ КОНЕЦ , ЛОЖЬ) КАК УСН,
		|	ЕСТЬNULL(УчетнаяПолитикаНалоговыйУчет.ОрганизацияЯвляетсяПлательщикомЕНВД, ЛОЖЬ) КАК ОрганизацияЯвляетсяПлательщикомЕНВД,
		|	ЕСТЬNULL(УчетнаяПолитикаНалоговыйУчет.ОбъектНалогообложенияУСН, ЗНАЧЕНИЕ(Перечисление.ОбъектыНалогообложенияПоУСН.ПустаяСсылка)) КАК ОбъектНалогообложенияУСН,
		|	ЕСТЬNULL(УчетнаяПолитикаНалоговыйУчет.УплачиватьДобровольныеВзносыВФСС, ЛОЖЬ) КАК УплачиватьДобровольныеВзносыВФСС,
		|	ЕСТЬNULL(УчетнаяПолитикаНалоговыйУчет.ВариантУчетаРасходовПоНалогамСФОТВНалоговомУчете, ЗНАЧЕНИЕ(Перечисление.ВариантыУчетаРасходовПоНалогамСФОТВНалоговомУчете.ПустаяСсылка)) КАК ВариантУчетаРасходовПоНалогамСФОТВНалоговомУчете,
		|	ЕСТЬNULL(УчетнаяПолитикаНалоговыйУчет.ТочностьИсчисленияЕСН, ЗНАЧЕНИЕ(Перечисление.ПорядкиОкругленияЕСН.Точно)) КАК ТочностьИсчисленияЕСН,
		|	ЕСТЬNULL(УчетнаяПолитикаНалоговыйУчет.ТочностьИсчисленияПФР, ЗНАЧЕНИЕ(Перечисление.ПорядкиОкругленияЕСН.Точно)) КАК ТочностьИсчисленияПФР,
		|	ЕСТЬNULL(УчетнаяПолитикаНалоговыйУчет.ПорядокРасчетаВычетаФБ, ЗНАЧЕНИЕ(Перечисление.ПорядкиИсчисленияВычетаПоЕСН.ПоСуммеСтраховыхВзносов)) КАК ПорядокРасчетаВычетаФБ
		|ИЗ
		|	Справочник.Организации КАК Организации
		|		ЛЕВОЕ СОЕДИНЕНИЕ ВТПериоды КАК ВТПериоды
		|		ПО (ИСТИНА)
		|		ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
		|			УчетнаяПолитикаНалоговыйУчет.Организация КАК Организация,
		|			МАКСИМУМ(УчетнаяПолитикаНалоговыйУчет.Период) КАК ДатаРегистра,
		|			ВТПериоды.Период КАК Период
		|		ИЗ
		|			ВТПериоды КАК ВТПериоды
		|				ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УчетнаяПолитикаОрганизаций КАК УчетнаяПолитикаНалоговыйУчет
		|				ПО ВТПериоды.Период >= УчетнаяПолитикаНалоговыйУчет.Период
		|		
		|		СГРУППИРОВАТЬ ПО
		|			УчетнаяПолитикаНалоговыйУчет.Организация,
		|			ВТПериоды.Период) КАК ДатыУстановленияУчПолитикиНалоговыйУчет
		|			ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.УчетнаяПолитикаОрганизаций КАК УчетнаяПолитикаНалоговыйУчет
		|			ПО ДатыУстановленияУчПолитикиНалоговыйУчет.Организация = УчетнаяПолитикаНалоговыйУчет.Организация
		|				И ДатыУстановленияУчПолитикиНалоговыйУчет.ДатаРегистра = УчетнаяПолитикаНалоговыйУчет.Период
		|		ПО (ВЫБОР
		|				КОГДА Организации.ГоловнаяОрганизация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
		|					ТОГДА Организации.Ссылка
		|				ИНАЧЕ Организации.ГоловнаяОрганизация
		|			КОНЕЦ = ДатыУстановленияУчПолитикиНалоговыйУчет.Организация)
		|			И (ВТПериоды.Период = ДатыУстановленияУчПолитикиНалоговыйУчет.Период)
		|		
		|
		|УПОРЯДОЧИТЬ ПО
		|	Период,
		|	Организация";*/
				//Выборка = Запрос.Выполнить().Выбрать();
				while(true/*Выборка.СледующийПоЗначениюПоля("Период")*/)
				{
					while(true/*Выборка.СледующийПоЗначениюПоля("Организация")*/)
					{
						//Структура = Новый Структура("УСН,ОбъектНалогообложенияУСН,ОрганизацияЯвляетсяПлательщикомЕНВД,УплачиватьДобровольныеВзносыВФСС,ВариантУчетаРасходовПоНалогамСФОТВНалоговомУчете, ТочностьИсчисленияЕСН, ТочностьИсчисленияПФР, ПорядокРасчетаВычетаФБ");
						//ЗаполнитьЗначенияСвойств(Структура,Выборка);
						//УчетнаяПолитикаПоНалоговомуУчетуСоответствие.Вставить(Выборка.Организация,Структура);
					}
					/*;
			УчетнаяПолитикаПоНалоговомуУчету.Вставить(?(ЗначениеЗаполнено(Выборка.Период),КонецМесяца(Выборка.Период),Выборка.Период),УчетнаяПолитикаПоНалоговомуУчетуСоответствие);*/
					//УчетнаяПолитикаПоНалоговомуУчетуСоответствие = Новый Соответствие;
					//УчетнаяПолитикаПоНалоговомуУчетуСоответствие.Вставить(Справочники.Организации.ПустаяСсылка(),Новый Структура("УСН,ОбъектНалогообложенияУСН,ОрганизацияЯвляетсяПлательщикомЕНВД,УплачиватьДобровольныеВзносыВФСС,ВариантУчетаРасходовПоНалогамСФОТВНалоговомУчете, ТочностьИсчисленияЕСН, ТочностьИсчисленияПФР, ПорядокРасчетаВычетаФБ",Ложь,Перечисления.ОбъектыНалогообложенияПоУСН.ПустаяСсылка(),Ложь,Ложь,Перечисления.ВариантыУчетаРасходовПоНалогамСФОТВНалоговомУчете.ПустаяСсылка(), Перечисления.ПорядкиОкругленияЕСН.Точно, Перечисления.ПорядкиОкругленияЕСН.Точно, Перечисления.ПорядкиИсчисленияВычетаПоЕСН.ПоСуммеСтраховыхВзносов));
				}
				//;;
			}
			return null;
		}
		// ЗаполнениеУчетнойПолитикиНалоговомуУчету
		// Функция инициализирует глобальную переменную глУчетнаяПолитикаПоПерсоналу.
		// Переменная содержит структуру.
		//
		// Параметры:
		//  Нет.
		//

		public object ЗаполнениеУчетнойПолитикиПоПерсоналу(/**/)
		{
			/*Экспорт
	
	УчетнаяПолитикаПоПерсоналу = Новый Структура();*/
			//УчетнаяПолитикаПоПерсоналу.КоличествоДнейОтпускаВГод = 20;
			//УчетнаяПолитикаПоПерсоналу.УпрощенныйУчетВзаиморасчетов = Истина;
			//Выборка = РегистрыСведений.УчетнаяПолитикаПоПерсоналу.Выбрать();
			while(true/*Выборка.Следующий()*/)
			{
				//ЗаполнитьЗначенияСвойств(УчетнаяПолитикаПоПерсоналу, Выборка);
			}
			return null;
		}
		// Заполняет структуру - Регистр и список регистраторов этого регистра
		//
		// Возвращаемое значение:
		//   Структура   - Ключ - Имя регистра, Значение - СписокЗначений, регистраторы этого регистра
		//

		public object ЗаполнитьСтруктуруРегистрРегистраторы(/**/)
		{
			//Регистраторы = Новый Структура("Регистр","СписокРегистраторов");
			return null;
		}
		// ЗаполнитьСтруктуруРегистрРегистраторы()
		// Определяет есть ли денежные показатели с незаполненной валютой
		//

		public object ОпределитьНаличиеВалютныхПоказателей(/**/)
		{
			/*Запрос = Новый Запрос(
	"ВЫБРАТЬ
	 |	ПоказателиСхемМотивации.Ссылка
	 |ИЗ
	 |	Справочник.ПоказателиСхемМотивации КАК ПоказателиСхемМотивации
	 |ГДЕ
	 |	ПоказателиСхемМотивации.ТипПоказателя = Значение(Перечисление.ТипыПоказателейСхемМотивации.Денежный)
	 |	И ПоказателиСхемМотивации.Валюта = Значение(Справочник.Валюты.ПустаяСсылка)");*/
			//Выборка = Запрос.Выполнить().Выбрать();
			return null;
		}
		// Определяет нужно ли показывать валюту
		//

		public object ПоказыватьВалюту(/**/)
		{
			//ЗначениеУчетнойПолитикиПоПерсоналуВсехОрганизаций = ПроцедурыУправленияПерсоналом.ЗначениеУчетнойПолитикиПоПерсоналуВсехОрганизаций(глЗначениеПеременной("глУчетнаяПолитикаПоПерсоналуОрганизации"), "ИспользуютсяНачисленияВВалюте");
			//Возврат ОпределитьНаличиеВалютныхПоказателей() Или ?(ЗначениеУчетнойПолитикиПоПерсоналуВсехОрганизаций = NULL, Ложь,ЗначениеУчетнойПолитикиПоПерсоналуВсехОрганизаций);
			return null;
		}
	}
}
